package com.bbva.kyfb.kyfbws.services.v01;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.jee.arq.spring.core.httpService.HttpService;
import com.bbva.jee.arq.spring.core.log.I18nLog;
import com.bbva.jee.arq.spring.core.log.I18nLogFactory;
import com.bbva.jee.arq.spring.core.util.excepciones.PropiedadNoEncontradaExcepcion;
import com.bbva.kyfb.kyfbbofi.IFirmasBo;
import com.bbva.kyfb.kyfbdto.firmas.bo.ComponenteFirmable;
import com.bbva.kyfb.kyfbdto.firmas.bo.DatosPAU;
import com.bbva.kyfb.kyfbdto.firmas.bo.DeletedFilesDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.EmpresaNifOutDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.EmpresaRefOutDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroInfo;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroPdteFirma;
import com.bbva.kyfb.kyfbdto.firmas.bo.FirmaComponente;
import com.bbva.kyfb.kyfbdto.firmas.bo.FirmanteInfo;
import com.bbva.kyfb.kyfbdto.firmas.bo.InfoComponentDetailDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.InfoComponentInDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.ListNData;
import com.bbva.kyfb.kyfbdto.firmas.bo.Listado;
import com.bbva.kyfb.kyfbdto.firmas.bo.NotificacionOutDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.OrdenMifidOutDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.UpdateInfoOutDto;
import com.bbva.kyfb.kyfbdto.firmas.errores.Errores_kyfb_servicios;
import com.bbva.kyfb.kyfbdto.firmas.fachada.interfaces.v01.ISrvFirmasV01;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.ComponentsForSignRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.DeletedFilesResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoComponent;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoComponentDetail;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoComponentRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoComponentsResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAudit;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAuditRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAuditResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileCompanie;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileCompaniesRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileCompaniesResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileDetailedRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileFir;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileFirResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileMiFID;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileMiFIDRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFilteredSignersRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoReferenceRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoSendNotificationRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoSendNotificationResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoSignerUser;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoSignerUserRealized;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoSignersRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoToDeleteRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoUpdateNumeroAleatorioRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoUpdateNumeroAleatorioResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.NewFileRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.SignedComponentsResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.SignerUsersResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.SignerUsersResponseRealized;
import com.bbva.kyfb.kyfbdto.firmas.filtros.FilesDeleteInfo;
import com.bbva.kyfb.kyfbutils.constantes.ConstantesFO;
import com.bbva.kyfb.kyfbws.converters.DtoInToDtoOut;
import com.bbva.kyfb.kyfbws.converters.DtoOutToDtoIn;

/**
 * The Class SrvFirmasV01.
 */
@Component
@HttpService(serviceName="servicioFirmasHttp")
public class SrvFirmasV01 implements ISrvFirmasV01 {

	/** Variable LOG. */
	private static final I18nLog LOG = I18nLogFactory.getLogI18n(SrvFirmasV01.class);

	/** The servicio firmas bo. */
	@Autowired
	private transient IFirmasBo servicioFirmasBo;

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoFileFirResponse getComponentesPendientesReferencia(final InfoFileRequest info) {

		final InfoFileFirResponse fileResponse = new InfoFileFirResponse();

		ArrayList <InfoFileFir> listaFiles = null;
		try {
			final FicheroInfo ficheroInfo = DtoOutToDtoIn.infoFileRequestToFicheroInfo(info);
			ListNData<FicheroPdteFirma,String[]> list;

			if (ConstantesFO.SIGLAS_FIRMA_SERVIDOR.equalsIgnoreCase(info.getsTipoFirma())){
				list=new ListNData<FicheroPdteFirma,String[]>(servicioFirmasBo.getComponentesPendientesReferencia(ficheroInfo),null);
			}else{
				list=servicioFirmasBo.getComponentesPendientesReferenciaHost(ficheroInfo);
			}

			//a la lista de ordenes/ficheros pendientes de firma para la empresa, dejamos los
			//que pueden ser firmados por la aplicacion de origen
			//recuperamos las ordenes firmables para la aplicacion de origen
			listaFiles = DtoInToDtoOut.ficherosPdteFirmaToInfoFileFirs(list.getList());

			if(listaFiles.isEmpty()) {
				throw new ExcepcionEjecucionAplicacion(Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}

			fileResponse.setTotalComponentes(servicioFirmasBo.getTotalComponentesPdtesReferencia(ficheroInfo,list.getData()));
			fileResponse.setCodError(Errores_kyfb_servicios.OK.toString());
		} catch(final ExcepcionEjecucionAplicacion ea) {
			listaFiles = new ArrayList<InfoFileFir>();
			fileResponse.setCodError(ea.getCodigoError().toString());
			fileResponse.setTotalComponentes(listaFiles.size());
		}
		fileResponse.setInfoFilesFir(listaFiles);
		return fileResponse;
	}

	/* (non-Javadoc)
	 * @see com.bbva.kyfb.kyfbws.services.v01.ISrvFirmasV01#getUsuariosFirmaRealizada(com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoSignersRequest)
	/**
	 * {@inheritDoc}
	 */
	@Override
	public SignerUsersResponseRealized getUsuariosFirmaRealizada(final InfoSignersRequest info) {
		final SignerUsersResponseRealized signers= new SignerUsersResponseRealized();
		ArrayList<InfoSignerUserRealized> infoSigners= new ArrayList<InfoSignerUserRealized>();
		try {
			FicheroInfo ficheroInfo = new FicheroInfo();
			ficheroInfo = DtoOutToDtoIn.infoSignersRequestToFicheroInfo(info);
			final List<FirmanteInfo> firmantes=servicioFirmasBo.getUsuariosFirmaRealizada(ficheroInfo);
			infoSigners = DtoInToDtoOut.firmantesInfoToInfoSignersUserRealized(firmantes);
			signers.setCodError(Errores_kyfb_servicios.OK.toString());
		} catch(final ExcepcionEjecucionAplicacion ea) {
			signers.setCodError(ea.getCodigoError().toString());
		}
		signers.setInfoSignerUsers(infoSigners);
		return signers;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public SignerUsersResponse getUsuariosFirmaPendiente(final InfoFilteredSignersRequest info) {
		final SignerUsersResponse signers = new SignerUsersResponse();
		ArrayList <InfoSignerUser> infoSigners = new ArrayList<InfoSignerUser>();
		try {
			final FicheroInfo ficheroInfo = DtoOutToDtoIn.infoFilteredSignersRequestToFicheroInfo(info);

			final FicheroPdteFirma ficheroPdte = servicioFirmasBo.getFicheroPdteFirma(ficheroInfo);

			List<FirmanteInfo> posiblesFirmantes;
			if(info.getsTipoFirma().equals(ConstantesFO.SIGLAS_FIRMA_SERVIDOR)) {
				posiblesFirmantes = servicioFirmasBo.getUsuariosFirmaPedte(ficheroInfo,ficheroPdte);
			} else {//if (info.getsTipoFirma().equals(Constantes.SIGLAS_FIRMA_HOST)) { Comentado por pmd os es FS o FH obligatoriamente
				posiblesFirmantes = servicioFirmasBo.getUsuariosFirmaPedteHost(ficheroInfo,ficheroPdte);
			}

			final String codMsgAcp = servicioFirmasBo.mergeMsgAcepTipoOrden(info.getsCodOrigen(),ficheroPdte.getsCodTipoOrden(), posiblesFirmantes);

			signers.setCodigoMensajeAceptacion(codMsgAcp);

			infoSigners = DtoInToDtoOut.firmantesInfoToInfoSignersUser(posiblesFirmantes);
			signers.setCodError(Errores_kyfb_servicios.OK.toString());
		} catch(final ExcepcionEjecucionAplicacion ea) {
			signers.setCodError(ea.getCodigoError().toString());
		}
		signers.setInfoSignerUsers(infoSigners);
		return signers;
	}


	private List<FicheroPdteFirma> realizarPaginadoReferenciaUsuario(final List<FicheroPdteFirma> list, final FicheroInfo ficheroInfo) {

		final List<FicheroPdteFirma> listaux = new ArrayList<FicheroPdteFirma>();

		if (ficheroInfo.getsPaginacionDesde() < 1) {
			// Si es menor que 1, debemos inicializar la variable a 1
			ficheroInfo.setsPaginacionDesde(1);
		}

		if (ficheroInfo.getsPaginacionDesde() > list.size()) {
			// Si es mayor que el numero de elementos existentes, devolvemos error de paginado
			throw new ExcepcionEjecucionAplicacion(Errores_kyfb_servicios.ERROR_PAGINADO);
		}

		for(int i=ficheroInfo.getsPaginacionDesde()-1;listaux.size()<ficheroInfo.getsPaginacionNumElementos();i++) {
			if (i >= list.size()) {
				// Si nos vamos a pasar del maximo de elementos existentes, paramos el for
				break;
			}
			listaux.add(list.get(i));
		}
		return listaux;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoFileFirResponse getComponentesPendientesReferenciaUsuario(final InfoFileDetailedRequest info) {
		final InfoFileFirResponse infoF = new InfoFileFirResponse();
		Listado<FicheroPdteFirma> pendientes = new Listado<FicheroPdteFirma>();
		ArrayList<InfoFileFir> infoFiles = new ArrayList<InfoFileFir>();
		try {
			final FicheroInfo ficheroInfo = DtoOutToDtoIn.infoFileDetailedRequestToFicheroInfo(info);

			if(info.getsTipoFirma().equals(ConstantesFO.SIGLAS_FIRMA_SERVIDOR)) {
				final List<FicheroPdteFirma> lstFchPndtFrm = servicioFirmasBo.getComponentesPendientesReferenciaUsuario(ficheroInfo);
				pendientes.setTotal(lstFchPndtFrm.size());
				pendientes.setLista(realizarPaginadoReferenciaUsuario(lstFchPndtFrm, ficheroInfo));
			} else if(info.getsTipoFirma().equals(ConstantesFO.SIGLAS_FIRMA_HOST)) {
				pendientes = servicioFirmasBo.getComponentesPendientesReferenciaUsuarioHost(ficheroInfo);
			}
			servicioFirmasBo.mergeMsgAcepCodUsuario(ficheroInfo.getCodAplicacion(), ficheroInfo.getsCodUsuario(), pendientes.getLista());

			infoFiles = DtoInToDtoOut.ficherosPdteFirmaToInfoFileFirs(pendientes.getLista());
			infoF.setCodError(Errores_kyfb_servicios.OK.toString());
		} catch(final ExcepcionEjecucionAplicacion ea) {
			infoF.setCodError(ea.getCodigoError().toString());
		}

		infoF.setTotalComponentes(pendientes.getTotal());
		infoF.setInfoFilesFir(infoFiles);

		return infoF;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoFileAuditResponse getAuditoriaComponentePendiente(final InfoFileAuditRequest info) {
		final InfoFileAuditResponse file = new InfoFileAuditResponse();
		ArrayList<InfoFileAudit> lista = new ArrayList<InfoFileAudit>();
		try{
			final FicheroInfo ficheroInfo = DtoOutToDtoIn.infoFileAuditRequestToFicheroInfo(info);
			lista = DtoInToDtoOut.auditoriasBoToInfoFileAuditsFacade(servicioFirmasBo.getAuditoriaComponentePendientes(ficheroInfo));
			file.setCodError(Errores_kyfb_servicios.OK.toString());
		} catch (final ExcepcionEjecucionAplicacion ea) {
			file.setCodError(ea.getCodigoError().toString());
		}
		file.setInfoFilesAudit(lista);
		return file;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoComponentsResponse getListaComponentesFirmables(final InfoReferenceRequest info) {
		final InfoComponentsResponse infoC = new InfoComponentsResponse();
		ArrayList<InfoComponent> listaComponents = new ArrayList<InfoComponent>();
		try {
			FicheroInfo ficheroInfo = new FicheroInfo();
			ficheroInfo = DtoOutToDtoIn.infoReferenceRequestFacadeToFicheroInfoBo(info);
			final List<ComponenteFirmable> componentesFirmables = servicioFirmasBo.getComponentesFirmables(ficheroInfo, "S".equals(info.getsTieneReferenciaRelacionada()));
			listaComponents = DtoInToDtoOut.componentesFirmablesBoToInfoComponentsFacade(componentesFirmables);
			infoC.setCodError(Errores_kyfb_servicios.OK.toString());
		} catch (final ExcepcionEjecucionAplicacion ea) {
			infoC.setCodError(ea.getCodigoError().toString());
		}
		infoC.setInfoComponents(listaComponents);
		return infoC;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public DeletedFilesResponse deleteComponentePendiente(final InfoToDeleteRequest info) {
		DeletedFilesResponse deletedFilesResponse;
		try {
			final DatosPAU datosPau = DtoOutToDtoIn.userReferenceToFilesDatosPau(info.getInfoUserReference());
			final List<FilesDeleteInfo> filesDeleteInfo = DtoOutToDtoIn.infoFilesToDeleteToFilesDeleteInfo(info.getInfoFilesToDelete());
			final List<DeletedFilesDto> deletedFilesDto = servicioFirmasBo.deleteComponentePendientes(filesDeleteInfo,datosPau,info.getInfoUserReference().getsTipoFirma(), info.getInfoUserReference().getsNIFUsuario(), info.getInfoUserReference().getsCodOrigen());
			deletedFilesResponse = DtoInToDtoOut.deletedFilesDtoToIDeletedFilesResponse(deletedFilesDto);
		} catch (final ExcepcionEjecucionAplicacion e) {
			//TODO: ¿Esto esta OK? ¿debe retornar null y listo?
			LOG.error(e,"SrvFirmasV01.deleteComponentePendiente(InfoToDeleteRequest)", info);
			deletedFilesResponse = null;
		}
		return deletedFilesResponse;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String createNuevoComponente(final NewFileRequest newFile) {
		return "200";
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public SignedComponentsResponse putFirmaComponente(final ComponentsForSignRequest components) {
		LOG.info("******* PUTFIRMA ******** Entrada a la funcion de firma");
		final long tiempoInicial = System.currentTimeMillis();
		SignedComponentsResponse signedComp = new SignedComponentsResponse();
		FirmaComponente firmaComponente = new FirmaComponente();
		try{
			final String tipoFirma = components.getInfoUserReference().getsTipoFirma().trim();
			firmaComponente = DtoOutToDtoIn.componentsForSignRequestToFirmaComponente(components);
			LOG.info("SrvFirmasV01 --- putFirmaComponente (parametros), tipoFirma: "+tipoFirma);
			if( tipoFirma.equalsIgnoreCase(ConstantesFO.SIGLAS_FIRMA_SERVIDOR) ){
				signedComp = servicioFirmasBo.putFirmaComponente(firmaComponente);
			} else {
				//Si no hay otro tipo no usar elseif
				//if (tipoFirma.equalsIgnoreCase(Constantes.SIGLAS_FIRMA_HOST) ){
				signedComp = servicioFirmasBo.putFirmaComponenteHost(firmaComponente);
			}
			signedComp.setCodError(Errores_kyfb_servicios.OK.toString());
		} catch (final ExcepcionEjecucionAplicacion e) {
			signedComp.setCodError( e.getCodigoError().toString() );
		} catch (final Exception e){
			signedComp.setCodError( Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE.toString() );
		}
		final long tiempoFinal = System.currentTimeMillis();
		final long tiempoTotal = tiempoFinal - tiempoInicial;
		LOG.info("******* PUTFIRMA ********  Salida funcion de firma");
		LOG.info("******* PUTFIRMA ******** Tiempo de ejecucion en miliseg: "+ tiempoTotal);
		return signedComp;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoComponentDetail getDetalleComponente(final InfoComponentRequest info) {

		InfoComponentDetail infoCompResp = new InfoComponentDetail();
		InfoComponentInDto infoCompDetDto = new InfoComponentInDto();

		try{
			LOG.info("COMENZAMOS PETICION GETDETALLECOMPONENTE");
			infoCompDetDto = DtoOutToDtoIn.infoComponentDetailToInfoComponentDetailDto(info);
			final InfoComponentDetailDto infoCompOutDto = servicioFirmasBo.getDetalleComponente(infoCompDetDto);
			LOG.info("EL METODO GETDETALLECOMPONENTE SE HA EJECUTADO CORRECTAMENTE "+infoCompOutDto.getCodError());
			infoCompResp = DtoInToDtoOut.infoComponentsDetailOutDtoToInfoComponentsDetail(infoCompOutDto);

			return infoCompResp;
		} catch (final ExcepcionEjecucionAplicacion e) {
			final InfoComponentDetail err = new InfoComponentDetail();
			err.setCodError( e.getCodigoError().toString() );

			if(ConstantesFO.ERRORES_DETALLE_MAP.containsKey(err.getCodError())) {
				LOG.error("SrvFirmasV01.getDetalleComponente - Ha ocurrido un error concreto desde CBTF ("+err.getCodError()+")");
			} else {
				LOG.error("SrvFirmasV01.getDetalleComponente - Ha ocurrido un error generico ("+err.getCodError()+")");
			}

			return err;
		} catch (final Exception e){
			final InfoComponentDetail err = new InfoComponentDetail();
			err.setCodError( Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE.toString() );
			LOG.error("SrvFirmasV01.getDetalleComponente - Ha ocurrido un error generico de servicio no disponible");
			return err;
		}
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoFileMiFID getComponenteTipoMifid(final InfoFileMiFIDRequest info) {
		InfoFileMiFID infoFileMifid = new InfoFileMiFID();
		infoFileMifid.setsTipoMiFID("");
		try {
			final OrdenMifidOutDto ordenMifidOutDto = servicioFirmasBo.getComponenteTipoMifid(DtoOutToDtoIn.infoFileMiFIDToOrdenMifid(info));
			infoFileMifid = DtoInToDtoOut.ordenMifidOutDtoToInfoFileMiFID(ordenMifidOutDto);
			infoFileMifid.setCodError(Errores_kyfb_servicios.OK.toString());
		} catch (final ExcepcionEjecucionAplicacion e) {
			LOG.error("Se capturo una excepcion, retornamos infoFileMifid vacio", e);
			infoFileMifid.setCodError(String.valueOf(e.getCodigoError()));
		} catch (final NumberFormatException e) {
			LOG.error("Se capturo una excepcion, retornamos infoFileMifid vacio", e);
			infoFileMifid.setCodError(Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE.toString());
		} catch (final PropiedadNoEncontradaExcepcion e) {
			LOG.error("Se capturo una excepcion, retornamos infoFileMifid vacio", e);
			infoFileMifid.setCodError(Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE.toString());
		}
		return infoFileMifid;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoFileCompaniesResponse getConsultaEmpresasAsociadas(final InfoFileCompaniesRequest info) {
		InfoFileCompaniesResponse infoFileCompanieResponse = new InfoFileCompaniesResponse();
		try {
			if (StringUtils.isEmpty(info.getsDNISolicitud())) {
				final EmpresaRefOutDto empresaRefOutDto = servicioFirmasBo.getConsultaEmpresasAsociadasPorReferencia(DtoOutToDtoIn.infoFileCompaniesToEmpresaRefOutDto(info));
				infoFileCompanieResponse = DtoInToDtoOut.empresaRefOutDtoToInfoFileCompanie(empresaRefOutDto);
			} else {
				final EmpresaNifOutDto empresaNifOutDto = servicioFirmasBo.getConsultaEmpresasAsociadasPorNif(DtoOutToDtoIn.infoFileCompaniesToEmpresaNifOutDto(info));
				infoFileCompanieResponse = DtoInToDtoOut.empresaNifOutDtoToInfoFileCompanie(empresaNifOutDto);
			}
			validaNifs(infoFileCompanieResponse);
			infoFileCompanieResponse.setCodError(String.valueOf(Errores_kyfb_servicios.OK));
		} catch (final ExcepcionEjecucionAplicacion e) {
			infoFileCompanieResponse.setCodError(String.valueOf(e.getCodigoError()));
		}
		return infoFileCompanieResponse;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoSendNotificationResponse sendNotificacion(final InfoSendNotificationRequest info) {
		InfoSendNotificationResponse infoSendNotificationResponse = new InfoSendNotificationResponse();
		try {
			final NotificacionOutDto notifiacionOutDto = servicioFirmasBo.sendNotificacion(DtoOutToDtoIn.infoSendNotificationToNotifiacionOutDto(info));
			infoSendNotificationResponse = DtoInToDtoOut.notificacionOutDtoToInfoSendNotification(notifiacionOutDto);
			//TODO No deberia devolverse OK?
			//infoSendNotificationResponse.setCodError(String.valueOf(Errores_kyfb_servicios.OK));
		} catch (final ExcepcionEjecucionAplicacion e) {
			infoSendNotificationResponse.setCodError(String.valueOf(e.getCodigoError()));
		} catch (final PropiedadNoEncontradaExcepcion e) {
			infoSendNotificationResponse.setCodError(String.valueOf(Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE));
		}
		return infoSendNotificationResponse;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoUpdateNumeroAleatorioResponse updateNumeroAleatorioComponentesUsuario(final InfoUpdateNumeroAleatorioRequest info) {
		InfoUpdateNumeroAleatorioResponse infoUpdateNumeroAleatorioResponse = new InfoUpdateNumeroAleatorioResponse();
		try {
			final UpdateInfoOutDto respuesta = servicioFirmasBo.updateNumeroAleatorioComponentesUsuario(DtoOutToDtoIn.infoUpdateNumOutToUpdateInfoIn(info));
			infoUpdateNumeroAleatorioResponse = DtoInToDtoOut.infoUpdateOutToinfoUpdateResponse(respuesta);
			infoUpdateNumeroAleatorioResponse.setCodError(String.valueOf(Errores_kyfb_servicios.OK));
		} catch (final ExcepcionEjecucionAplicacion e) {
			infoUpdateNumeroAleatorioResponse.setsNumeroAleatorio("");
			infoUpdateNumeroAleatorioResponse.setCodError(e.getCodigoError().toString());
		} catch (final Exception e) {
			infoUpdateNumeroAleatorioResponse.setsNumeroAleatorio("");
			infoUpdateNumeroAleatorioResponse.setCodError(Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE.toString());
		}

		return infoUpdateNumeroAleatorioResponse;
	}

	private void validaNifs(final InfoFileCompaniesResponse infoFileCompanieResponse)
	{
		final ArrayList<InfoFileCompanie> infoComps=  infoFileCompanieResponse.getInfoCompanies();
		for(final InfoFileCompanie info:infoComps)
		{
			if(info.getsCodigoClienteR()==null)
			{
				info.setsCodigoClienteR("0");
			}
		}
	}
}
